package xu.jiang.report.dealer.layer;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import xu.jiang.report.util.report.POIUtil;

import java.io.IOException;
import java.util.List;

/**
 *
 * 将高度固定 fixedHeight 的层
 * 如果 dataRowSize < fixedHeight => 则数据末尾的下一行追加如下文字： （以下空白）
 * 如果 dataRowSize > fixedHeight => 则 fixedHeight 无效，将数据一直输出即可,与父类 LoopLayer 相同。
 *
 * @dependence 所用报表模版的特点：Layer 内会将提前预留出 fixedHeight 的行，无需创建。
 */

public class FixedDataHeightLayer extends LoopLayer {
    /**
     * 包括层替换符所在的 行
     */
    public final int getDataHeightInHeadPage;
    public final String blankText = "（以下空白）";

    public FixedDataHeightLayer(LayerBaseParam layerBaseParam, int fixedDataHeight) throws IOException {
        super(layerBaseParam);
        this.getDataHeightInHeadPage = fixedDataHeight;
    }

    @Override
    public int writeData(int appendRowNum, Sheet sheet, MySQLData data) {
        if (this.getDataHeightInHeadPage <= 0) {
            throw new IllegalArgumentException("the param 'fixedDataHeight' must be more than 0");
        }
        List<Object[]> olist = data.pureData;

        /**
         * 如果 dataRowSize > fixedHeight => 则 fixedHeight 无效，将数据一直输出即可。
         */
        if (olist.size() > this.getDataHeightInHeadPage) {
            return super.writeData(appendRowNum, sheet, data);
        }

        /**
         * 进入这里，说明数据行数小于模版中预留的数据空白行
         */

        //计算当前数据写入的行号
        int currentIndexRow = appendRowNum + this.getIndex();

        int nextRowIndex = this.writeDataByStartRowIndex(currentIndexRow, sheet, data);

//        //插入文字
//        if(olist.size()<this.getDataHeightInHeadPage){
//            Row row = POIUtil.getOrCreateRow(sheet, nextRowIndex);
//            Cell c = POIUtil.getOrCreateCell(row, 0);
//            c.setCellValue(this.blankText);
//        }


        //由于层内属性的替换符所在行也会被数据填充，所以需要【减 1】
        return 0;


    }

    /**
     * 重写父类方法
     *
     * @param currentIndexRow
     * @param sheet
     * @param data
     * @param printDataStart
     * @param printDataEnd
     * @return
     */
    @Override
    protected int writeDataByStartRowIndex(int currentIndexRow, Sheet sheet, MySQLData data, int printDataStart, int printDataEnd) {


        int nextRowIndex = super.writeDataByStartRowIndex(currentIndexRow, sheet, data, printDataStart, printDataEnd);
        //判定当页的空白行和实际数据的关系，如果存在多余空白行，则加入特殊文字
        //插入特殊文字
        if (printDataEnd - printDataStart + 1 < this.getDataHeightInHeadPage) {
            Row row = POIUtil.getOrCreateRow(sheet, nextRowIndex);
            Cell c = POIUtil.getOrCreateCell(row, 0);
            c.setCellValue(this.blankText);
        }

        //没啥用了
        return 0;
    }
}